﻿// Jinx AJAX Framework
// Copyright (C) 2008 Blake Hegerle
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using Jinx;
using Jinx.Communications;
using Jinx.Controllers;
using Jinx.Models.Sequences;

namespace TestServer
{
    public interface IBase
    {
        string Name { get; set; }
        bool Active { get; set; }
    }

    public interface IClass : IBase
    {
    }

    public interface IDetail
    {
        string Name { get; set; }
        IDetail Detail { get; set; }
    }

    public interface IModel : IBase
    {
        Sequence<IClass> Classes { get; set; }
        int Id { get; set; }
        double Gpa { get; set; }

        IClass Null { get; set; }

        IDetail Detail { get; set; }
    }

    public class Controller : IController
    {
        private readonly IModel Model;

        public Controller()
        {
            Model = App.New<IModel>("Model");
            Model.Name = "Andy";
            Model.Detail = App.New<IDetail>();
            Model.Detail.Detail = App.New<IDetail>();
            Model.Detail.Detail.Detail = App.New<IDetail>();

            Model.Detail.Name = "outer";
            Model.Detail.Detail.Name = "middle";
            Model.Detail.Detail.Detail.Name = "inner";
        }

        [Operation]
        public void Bar()
        {
            Model.Name = "Sue";
            Model.Classes = new FixedSequence<IClass>(2);

            Model.Classes[0] = App.New<IClass>();
            Model.Classes[1] = App.New<IClass>();

            Model.Classes[0].Name = "Algebra";
            Model.Classes[1].Name = "Parenting 101";
        }
    }

    internal class Program
    {
        private static void Main()
        {
            var ServerFactory = new AppServerFactory<Controller>
                                {
                                    BaseControllerName = "foo",
                                    VirtualDirectory = "jinx"
                                };

            using (var AppServer = ServerFactory.Create())
            {
                Console.WriteLine(AppServer.EntryPoint);
                Console.ReadLine();
            }
        }
    }
}